package org.msfj.admin.data.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.msfj.admin.data.service.MetadataTypeService;
import org.msfj.admin.model.MetadataType;
import org.msfj.admin.vo.MetadataTypeVo;
import org.msfj.admin.data.service.MetadataTypeService;
import org.msfj.admin.model.MetadataType;
import org.msfj.admin.vo.MetadataTypeVo;
import org.msfj.admin.data.service.MetadataTypeService;
import org.msfj.admin.model.MetadataType;
import org.msfj.admin.vo.MetadataTypeVo;
import org.msfj.common.annotation.Constants;
import org.msfj.common.base.BaseServiceImpl;
import org.msfj.common.enums.Enable;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 系统元数据类型service实现类
 * @Author: like
 * @Email: like@deyatong.com
 * @Date: 2017-08-10 17:30:20
 * @Version: 1.0
 * @Created in idea by autoCode
 */

@Service
@CacheConfig(cacheNames = Constants.CACHE_NAMESPACE + "metadataType")
public class MetadataTypeServiceImpl extends BaseServiceImpl<MetadataType> implements MetadataTypeService {

    /**
     * 根据条件分页查询系统元数据类型列表
     *
     * @param metadataTypeVo
     * @param page 当前第几页
     * @param rows 每页多少条记录
     * @return PageInfo<MetadataType>
     */
    @Override
    //@Cacheable
    public PageInfo<MetadataTypeVo> getByMetadataType(MetadataTypeVo metadataTypeVo, int page, int rows){
        Example example = new Example(MetadataType.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("enable", Enable.ENABLE.getCode());
        PageHelper.startPage(page, rows);
        List<MetadataType> metadataTypeList = super.getByExample(example);
        PageInfo metadataTypeVoPageInfo = new PageInfo(metadataTypeList);
        metadataTypeVoPageInfo.setList(setOtherProperties(metadataTypeList));
        return metadataTypeVoPageInfo;
    }

    /**
     * 根据条件查询所有系统元数据类型对象列表
     *
     * @param metadataTypeVo
     * @return List<MetadataType>
     */
    @Override
    //@Cacheable
    public List<MetadataTypeVo> getAllMetadataType(MetadataTypeVo metadataTypeVo){
        Example example = new Example(MetadataType.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("enable", Enable.ENABLE.getCode());
        List<MetadataTypeVo> metadataTypeVoList = setOtherProperties(super.getByExample(example));
        return metadataTypeVoList;
    }

    /**
    * 根据条件查询系统元数据类型的tree对象
    *
    * @return
    */
    @Override
    //@Cacheable
    public List<MetadataTypeVo> getMetadataTypeTree() {
        List<MetadataTypeVo> metadataTypeVos = this.getAllMetadataType(null);
        List<MetadataTypeVo> rootmetadataTypes = CollectionUtil.newArrayList();
            if (CollectionUtil.isNotEmpty(metadataTypeVos)) {
                for (MetadataTypeVo metadataTypeVo : metadataTypeVos) {
                StringBuffer treePosition = new StringBuffer();
                if (ObjectUtil.isNotNull(metadataTypeVo.getTreePosition())) {
                    treePosition.append(metadataTypeVo.getTreePosition()).append("&");
                }
                treePosition.append(metadataTypeVo.getId());
                metadataTypeVo.setTreePosition(treePosition.toString());
                metadataTypeVo.setLabel(metadataTypeVo.getName());
                if (ObjectUtil.equal(metadataTypeVo.getParentId(), "0")) {
                    rootmetadataTypes.add(metadataTypeVo);
                }
                for (MetadataTypeVo childVo : metadataTypeVos) {
                    if (ObjectUtil.equal(childVo.getParentId(), metadataTypeVo.getId())) {
                        if (ObjectUtil.isNull(metadataTypeVo.getChildren())) {
                            List<MetadataTypeVo> children = CollectionUtil.newArrayList();
                            children.add(childVo);
                            metadataTypeVo.setChildren(children);
                        } else {
                            metadataTypeVo.getChildren().add(childVo);
                        }
                    }
                }
            }
        }
        return rootmetadataTypes;
    }

    /**
     * 设置vo的其他属性属性
     *
     * @param metadataType
     * @return DepartmentVo
     */
    @Override
    //@Cacheable
    public MetadataTypeVo setOtherProperties(MetadataType metadataType){
        MetadataTypeVo metadataTypeVo = new MetadataTypeVo();
        BeanUtils.copyProperties(metadataType,metadataTypeVo);
        return metadataTypeVo;
    }

    /**
     * 设置vo的其他属性属性
     *
     * @param metadataTypes
     * @return List<MetadataTypeVo>
    */
    @Override
    //@Cacheable
    public List<MetadataTypeVo> setOtherProperties(List<MetadataType> metadataTypes){
        List<MetadataTypeVo> metadataTypeVos = new ArrayList<>();
        if(CollectionUtil.isNotEmpty(metadataTypes)){
            for(MetadataType metadataType : metadataTypes){
                MetadataTypeVo metadataTypeVo = new MetadataTypeVo();
                BeanUtils.copyProperties(metadataType,metadataTypeVo);
                metadataTypeVos.add(metadataTypeVo);
            }
        }
        return metadataTypeVos;
    }
}
